/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "../../S_Physics.h"
#include "PBD核心.h"
#include "PBF_GPU数据.h"


/*
物理体具体实现对象绑定到 <S_物理体.m_Data> 指针上,方便不销毁物理体对象下切换物理体类型
*/




typedef struct {
	vec3	m_发射方向;
	uint32	m_Offset;
	uint32	m_Count;

	uint32	m_以发射索引偏移;

	S_体素* m_体素;

}S_PBF流体;

S_PBF流体*	f_PBF创建流体body();
void		f_PBF销毁流体body(S_PBF流体* body);
S_PBF刚体*	f_PBF创建刚体body();
void		f_PBF销毁刚体body(S_PBF刚体* body);

S_PBF粒子发射*	f_PBF创建粒子发射();
void			f_PBF销毁粒子发射(S_PBF粒子发射* body);





struct S_PBF物理体 : public S_物理体 {
	uint32		m_Offset;
	uint32		m_Count;

	std::vector<vec3> m_Points;

	virtual void f_构建粒子体素() = 0;
	virtual void f_构建粒子体素(vec3* 外部指针, float32* mess) {};
};




struct _S_PBF流体 : public S_PBF物理体 {
	//float32				m_密度;
	void*		m_UserObj;
	//uint32		m_Offset;
	//uint32		m_Count;
	_S_PBF流体(S_物理材质& 材质, const S_Tranform& t, uint32 数量, uint32 key = 0);
	~_S_PBF流体();

	void f_构建粒子体素();
	void f_构建粒子体素(vec3* 外部指针, float32* mess);
	void* f_getBody() { return 0; }
	void f_绑定关联对象(void* data) {
		//m_刚体;
	}
	void f_add粒子到缓存(S_PDB数据* core);
	//void f_setLocation(const vec3& loc);
	//void f_setRot(const vec3& loc);
	void f_setLocRot(const vec3& loc, const vec3& r);
	void f_setPos(const vec3& l);
	void f_setRot(const vec3& r);
	void f_setVel(const vec3& l);
};









/*struct S_PBF刚体 : public S_PBF物理体 {
	//float32				m_密度;
	void* m_UserObj;
	


	S_PBF刚体(S_物理材质& 材质, const S_Tranform& t, uint32 key = 0);
	~S_PBF刚体();


	void* f_getBody() { return 0; }

	void f_绑定关联对象(void* data) {
		//m_刚体;
	}

	void f_add粒子到缓存(S_PDB数据* core);
	//void f_setLocation(const vec3& loc);
	//void f_setRot(const vec3& loc);
	void f_setLocRot(const vec3& loc, const vec3& r);
	void f_setLoc(const vec3& l);
	void f_setRot(const vec3& r);
	void f_setVel(const vec3& l);

};*/



struct S_PBF控制 : public S_PBF物理体 {
	//float32				m_密度;
	void* m_UserObj;



	S_PBF控制(S_物理材质& 材质, const S_Tranform& t, uint32 key = 0);
	~S_PBF控制();


	void* f_getBody() { return 0; }

	void f_绑定关联对象(void* data) {
		//m_刚体;
	}

	void f_add粒子到缓存(S_PDB数据* core);
	//void f_setLocation(const vec3& loc);
	//void f_setRot(const vec3& loc);
	void f_setLocRot(const vec3& loc, const vec3& r);
	void f_setPos(const vec3& l);
	void f_setRot(const vec3& r);
	void f_setVel(const vec3& l);


};


struct S_PBF边界 : public S_PBF物理体 {
	//float32				m_密度;
	void*		m_UserObj;

	vec3		m_边界大小;
	float32		m_单元大小;


	S_PBF边界(vec3 大小, float32 间隔, const S_Tranform& t, uint32 key = 0);
	~S_PBF边界();

	void f_构建粒子体素();

	void* f_getBody() { return 0; }

	void f_绑定关联对象(void* data) {
		//m_刚体;
	}

	//void f_add粒子到缓存(S_PDB数据* core);
	//void f_setLocation(const vec3& loc);
	//void f_setRot(const vec3& loc);
	void f_setLocRot(const vec3& loc, const vec3& r);
	void f_setPos(const vec3& l);
	void f_setRot(const vec3& r);
	void f_setVel(const vec3& l);

};



struct S_PBF静态网格 : public S_PBF物理体 {
	//float32	m_密度;
	void*		m_UserObj;


	S_PBF静态网格(S_物理材质& 材质, const S_Tranform& t, uint32 key = 0);
	~S_PBF静态网格();



	void* f_getBody() { return 0; }

	void f_绑定关联对象(void* data) {
		//m_刚体;
	}


	void f_add粒子到缓存(S_PDB数据* core);

	//void f_setLocation(const vec3& loc);
	//void f_setRot(const vec3& loc);
	void f_setLocRot(const vec3& loc, const vec3& r);
	void f_setPos(const vec3& l);
	void f_setRot(const vec3& r);
	void f_setVel(const vec3& l);

};



 

struct S_PBF动态网格 : public S_PBF物理体 {
	//float32				m_密度;
	void* m_UserObj;


	S_PBF动态网格(S_物理材质& 材质, const S_Tranform& t, uint32 key = 0);
	~S_PBF动态网格();



	void* f_getBody() { return 0; }

	void f_绑定关联对象(void* data) {
		//m_刚体;
	}

	void f_add粒子到缓存(S_PDB数据* core);

	//void f_setLocation(const vec3& loc);
	//void f_setRot(const vec3& loc);
	void f_setLocRot(const vec3& loc, const vec3& r);
	void f_setPos(const vec3& l);
	void f_setRot(const vec3& r);
	void f_setVel(const vec3& l);

};





